/*
 * miniFreeRTOS
 * Copyright (c) 2024- yanl1229@163.com.
 * Written by yanl1229
 *
 * This code is licensed under the GPL.
 */

#include "userConfig.h"
#include "usart.h"
#include "lwip_comm.h"
#include "lwipopts.h"

#include "task.h"
#include "mutex.h"
#include "ff.h"

#include <lwip/apps/ping.h>

static FATFS fatfs;

/* START_TASK 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define START_TASK_PRIO         11           /* 任务优先级 */
#define START_STK_SIZE          256         /* 任务堆栈大小 */
struct task_struct * StartTask_Handler;             /* 任务句柄 */
/* LWIP_DEMO 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define LWIP_DMEO_TASK_PRIO     11           /* 任务优先级 */
#define LWIP_DMEO_STK_SIZE      1024        /* 任务堆栈大小 */
struct task_struct * LWIP_Task_Handler;             /* 任务句柄 */


void lwip_show_ip(uint8_t mode)
{
    uint8_t speed;
    uint8_t buf[30];

    if(mode & (1 << 1))
    {
        usart_transmit("lwIP 2.0.2 Init Successed\n");

        if(g_lwipdev.dhcpstatus == 2)
        {
            sprintf((char*)buf,"DHCP IP:%d.%d.%d.%d",g_lwipdev.ip[0],g_lwipdev.ip[1],g_lwipdev.ip[2],g_lwipdev.ip[3]);
        }
        else
        {
            sprintf((char*)buf,"Static IP:%d.%d.%d.%d",g_lwipdev.ip[0],g_lwipdev.ip[1],g_lwipdev.ip[2],g_lwipdev.ip[3]);
        }

        usart_transmit("%s\n", buf);

        speed = ethernet_chip_get_speed();

        if(speed)
        {
            usart_transmit("Ethernet Speed:100M\n");
        }
        else
        {
            usart_transmit("Ethernet Speed:10M\n");
        }
    }
}

/**
 * @brief       lwIP运行例程
 * @param       pvParameters : 传入参数(未用到)
 * @retval      无
 */
void lwip_demo_task(void *pvParameters)
{
    while(1)
    {
        task_delay(100);
        if (ping("192.168.2.128") == 0)
        {
            usart_transmit("ping finished\n");
            break;
        }
    }
    /**
     * FreeRTOS中任务执行 函数模型是一个while(1)的循环体，不循序跳出循环，如果
     * 一定要跳出循环体的话，跳出循环后执行删除任务，不然，会触发assert();
     */
    task_delete(LWIP_Task_Handler);
}

/**
 * @brief       start_task
 * @param       pvParameters : 传入参数
 * @retval      无
 */
static void start_lwip_task(void *pvParameters)
{
	FRESULT r = f_mount(&fatfs, "0:", 1);
	printf("f_mount returns %d\n", r);
	if (r == FR_NO_FILESYSTEM) {
		r = f_mkfs("", NULL, NULL, 0);
		usart_transmit("f_mkfs returns %d\n", r);
		r = f_mount(&fatfs, "", 1);
		usart_transmit("f_mount returns %d\n", r);
	}

    g_lwipdev.lwip_display_fn = lwip_show_ip;
    while(lwip_comm_init() != 0)
    {
        usart_transmit("lwIP Init failed!!\n");
        task_delay(500);
        usart_transmit("Retrying...       \n");
        task_delay(500);
    }

    /* 进入临界区 */
    disable_interrupt();

    /* 创建lwIP任务 */
    LWIP_Task_Handler = task_create(lwip_demo_task,
                (const char*    )"lwip_demo_task",
                (uint16_t       )LWIP_DMEO_STK_SIZE,
                (void*          )NULL,
                (uint32_t    )LWIP_DMEO_TASK_PRIO);

    /* 删除开始任务 */
    task_delete(StartTask_Handler);
    /* 退出临界区 */
    enable_interrupt();

}

/**
 * @breif       freertos_demo
 * @param       无
 * @retval      无
 */
void ftpd_demo(void)
{

    /* start_task */
    StartTask_Handler = task_create(start_lwip_task,            /* 任务函数 */
                (const char *   )"start_task",          /* 任务名称 */
                (uint16_t       )START_STK_SIZE,        /* 任务堆栈 */
                (void *         )NULL,                  /* 传递给任务函数的参数 */
                (uint32_t    )START_TASK_PRIO);

}

